// 通道方向
// 当使用通道作为函数的参数时，你可以指定这个通道是不是只用来发送或者接收值。这个特性提升了程序的类型安全性。
package main

import "fmt"

// ping 函数定义了一个只允许发送数据的通道。尝试使用这个通道来接收数据将会得到一个编译时错误。
// chan<- 表示发送通道，怎么记呢？箭头指向通道 chan，表示其他值发给通道
func ping(pings chan<- string, msg string) {
	pings <- msg
}

// pong 函数允许通道（pings）来接收数据，另一通道（pongs）来发送数据。
// <-chan 表示接收通道，怎么记呢？从 chan 指向别处，表示从通道中接收值，这个跟平常我们输出通道里的值（接收）的写法是一致的，记得一个另一个就记得了
func pong(pings <-chan string, pongs chan<- string) {
	msg := <-pings
	pongs <- msg
}
func main() {
	pings := make(chan string, 1)
	pongs := make(chan string, 1)
	// 先把内容给到 pings 通道里
	ping(pings, "passed message")
	// 内部先把 pings 的内容给到 msg（接收），再把 msg 的内容发送到 pongs 通道里
	pong(pings, pongs)
	fmt.Println(<-pongs)
}
